/*
 * =====================================================================================
 *
 *       Filename:  sockaddr.h
 *
 *    Description:  与网络相关的一些地址转换 
 *
 *        Version:  1.0
 *        Created:  2008年09月25日 10时09分58秒
 *       Revision:  none
 *       Compiler:  g++
 *
 *         Author:  ZhixiongHong (hzx), fishwarter@gmail.com
 *        Company:  Unioncast
 *
 * =====================================================================================
 */

#ifndef SS_SOCK_ADDR_H
#define SS_SOCK_ADDR_H

#ifndef WIN32
#include <netinet/in.h>
#else
#endif	// WIN32

#ifdef HAS_SS_NAMESPACE
namespace ss{
#endif // HAS_SS_NAMESPACE

class SockAddr
{
public:
	/*
	 * constructors 
	 */
	SockAddr(unsigned int ip, unsigned short port=0);
	/*
	 * @brief: 可以为ip串"219.223.19.194
 	 */
	SockAddr(const char* ipstr, unsigned short port=0);
	SockAddr(const SockAddr& addr);

public:
	/*
	 * overload operator
	 */
	SockAddr& operator=(const SockAddr& addr);
	bool operator==(const MSockAddr cmper);
	bool operator!=(const MSockAddr cmper);
			
	unsigned int getip() const { return ntohl(_addr.sin_addr.s_addr); }
	unsigned short getport() const { return ntohs(_addr.sin_port); }
	char* getipstr() const { return inet_ntoa(_addr.sin_addr); }


public:
	/*
	 *  @brief: 判断一个IP是否为私有IP
	 *  @ipstr: ip的字符串形式
  	 */
	static	bool is_private_ip(const char* ipstr);
	static	bool is_private_ip(unsigned int ip);

	/*
	 *	@brief: 判断一个字符串是否为ip串
	 */
	static 	bool is_ip_str(const char* content);
	
	/*
	 * @brief: 获取主机名
	 */
	static bool gethostname(char* str);

	/*
	 * @brief: 获取主机IP,如何处理多IP的情况呢？
	 */ 		
	
	static unsigned long getlocalip(); 

	/*
	 * @breif: 获取网关地址
	 */	
	static bool getgatwayaddress();

private:
	struct sockaddr_in		_addr;
};


#ifdef HAS_SS_NAMESPACE
}
#endif // HAS_SS_NAMESPACE

#endif // SS_SOCK_ADDR_H
